package study.service.user;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.barney.support.web.WebList;

import study.dao.user.UserMapper;
import study.domain.user.Authority;
import study.domain.user.RoleHierarchy;
import study.domain.user.User;
import study.domain.user.UserSearch;
import study.service.AbstractService;

/**
 * 사용자 서비스
 *
 * @author Barney Kim
 */
@Service
public class UserService extends AbstractService {

	@Autowired
	private UserMapper userDao;

	/**
	 * 사용자 목록을 반환한다.
	 *
	 * @param search 검색
	 */
	public WebList<User> getUsers(UserSearch search) {
		WebList<User> result = new WebList<User>();
		result.setTotal(userDao.getCount(search));
		if(result.isNotEmpty()) {
			result.setList(userDao.getUsers(search));
		}
		return result;
	}

	/**
	 * 사용자 ID로 검색하여 사용자를 반환한다.
	 *
	 * @param userId 사용자 ID
	 */
	public User getUser(Long userId) {
		return getUser(new User(userId));
	}

	/**
	 * 사용자명을 사용하여 사용자를 반환한다.
	 *
	 * @param username 사용자명
	 */
	public User getUser(String username) {
		return getUser(new User(username));
	}

	/**
	 * 사용자를 반환한다.
	 *
	 * @param search 검색
	 */
	public User getUser(User search) {
		return userDao.getUser(search);
	}

	/**
	 * 사용자를 추가한다.
	 *
	 * @param user 사용자
	 */
	public boolean addUser(User user) {
		prePersist(user);
		return userDao.addUser(user) == 1;
	}

	/**
	 * 사용자를 변경한다.
	 *
	 * @param user 사용자
	 */
	public boolean setUser(User user) {
		preUpdate(user);
		return userDao.setUser(user) == 1;
	}

	/**
	 * 사용자를 제거한다.
	 *
	 * @param userId 사용자 ID
	 */
	public boolean removeUser(Long userId) {
		return userDao.removeUser(userId) == 1;
	}

	/**
	 * 사용자 권한 목록을 반환한다.
	 *
	 * @param userId 사용자 ID
	 */
	public List<Authority> getAuthorities(Long userId) {
		return userDao.getAuthorities(userId);
	}

	/**
	 * Spring Security에서 사용할 역활 계층을 문자열로 반환한다.
	 *
	 * @see http://static.springsource.org/spring-security/site/docs/3.1.x/reference/authz-arch.html
	 */
	public String getRoleHierarchy() {
		List<RoleHierarchy> list = userDao.getRolesHierarchy();
		StringBuilder sb = new StringBuilder();
		for(RoleHierarchy r : list) {
			sb.append(r.getChildRole()).append(" > ").append(r.getParentRole()).append("\n");
		}
		return sb.toString();
	}
}
